自定义层¶
Note
有时候我们想要一个层实现某种功能,但tensorflow没有其默认实现,在这种情况下就需要自定义层。
无参数层¶
import tensorflow as tf
from tensorflow import keras
# 使用keras.layers.Lambda
exponential_layer = keras.layers.Lambda(lambda x: tf.exp(x))
# as expected
exponential_layer([0., 1.])
<tf.Tensor: shape=(2,), dtype=float32, numpy=array([1. , 2.7182817], dtype=float32)>
keras.layers.Layer的子类¶
最好的自定义层的方式是创建一个 keras.layers.Layer 的子类。
class MyDense(tf.keras.layers.Layer):
def __init__(self, num_outputs):
# 与input_shape无关的initialization
super(MyDense, self).__init__()
self.num_outputs = num_outputs
def build(self, input_shape):
# 与input_shape相关的initialization
# 首次使用层时会被调用
self.kernel = self.add_weight("kernel",
shape=[int(input_shape[-1]),
self.num_outputs])
def call(self, inputs):
# 正向传播
return tf.matmul(inputs, self.kernel)
# 像其他任何层一样使用MyDense层
model = keras.models.Sequential([
MyDense(30),
MyDense(1)
])